package com.jieli.bt.att.util;

import android.os.ParcelUuid;

import androidx.annotation.NonNull;

import java.util.Locale;
import java.util.UUID;

/**
 * UuidUtil
 *
 * @author zqjasonZhong
 * @email zhongzhuocheng@zh-jieli.com
 * @desc 蓝牙UUID工具类
 * @since 2024/11/14
 */
public class UuidUtil {
    /**
     * 标准UUID后缀
     */
    private static final String ST_UUID_SUFFIX = "0000-1000-8000-00805F9B34FB";

    /**
     * 比较两个UUID，忽略大小写
     *
     * @param uuid1 UUID
     * @param uuid2 UUID
     * @return boolean 结果
     */
    public static boolean equalUUID(UUID uuid1, UUID uuid2) {
        if (null == uuid1 || null == uuid2) return false;
        return uuid1.toString().equalsIgnoreCase(uuid2.toString());
    }

    /**
     * 16位前缀转换UUID
     *
     * @param prefix String 16位uuid前缀
     * @return UUID 蓝牙UUID
     */
    public static UUID to16BitUUID(@NonNull String prefix) {
        return UUID.fromString(formatString("0000%s-0000-1000-8000-00805F9B34FB", prefix));
    }

    /**
     * 32位前缀转换UUID
     *
     * @param prefix String 32位uuid前缀
     * @return UUID 蓝牙UUID
     */
    public static UUID to32BitUUID(@NonNull String prefix) {
        return UUID.fromString(formatString("%s-0000-1000-8000-00805F9B34FB", prefix));
    }

    /**
     * 128位前缀转换UUID
     *
     * @param string String 128位uuid前缀
     * @return UUID 蓝牙UUID
     */
    public static UUID to128BitUUID(String string) {
        return UUID.fromString(string);
    }

    /**
     * 转换UUID
     *
     * @param string String uuid字符串
     * @return ParcelUuid 蓝牙UUID
     */
    public static ParcelUuid toUUID(@NonNull String string) {
        switch (string.length()) {
            case 4:
                return new ParcelUuid(to16BitUUID(string));
            case 8:
                return new ParcelUuid(to32BitUUID(string));
            default:
                return new ParcelUuid(to128BitUUID(string));
        }
    }

    /**
     * 读取UUID的前16位字符串
     *
     * @param uuid UUID 蓝牙UUID
     * @return String 前16位字符串
     * <p>
     * 若不是标准的UUID，则返回整个UUID
     * </p>
     */
    public static String read16BitUUID(@NonNull UUID uuid) {
        String[] array = uuid.toString().split("-", 2);
        if (array.length != 2) return uuid.toString();
        if (!array[1].equalsIgnoreCase(ST_UUID_SUFFIX)) return uuid.toString();
        String prefix = array[0];
        if (prefix.length() != 8) return uuid.toString();
        return formatString("0x%s", prefix.substring(4).toUpperCase(Locale.getDefault()));
    }

    /**
     * 读取UUID的前32位字符串
     *
     * @param uuid UUID 蓝牙UUID
     * @return String 前32位字符串
     * <p>
     * 若不是标准的UUID，则返回整个UUID
     * </p>
     */
    public static String read32BitUUID(@NonNull UUID uuid) {
        String[] array = uuid.toString().split("-", 2);
        if (array.length != 2) return uuid.toString();
        if (!array[1].equalsIgnoreCase(ST_UUID_SUFFIX)) return uuid.toString();
        String prefix = array[0];
        if (prefix.length() != 8) return uuid.toString();
        return formatString("0x%s", prefix);
    }


    private static String formatString(String format, Object... args) {
        return String.format(Locale.ENGLISH, format, args);
    }
}
